[HVM] Save/restore: explicitly name MSRs in save format
authorTim Deegan <Tim.Deegan@xensource.com>
Fri, 16 Feb 2007 12:34:30 +0000 (12:34 +0000)
committerTim Deegan <Tim.Deegan@xensource.com>
Fri, 16 Feb 2007 12:34:30 +0000 (12:34 +0000)
Signed off by: Mats Petersson (Mats.Petersson@amd.com)

xen/arch/x86/hvm/svm/svm.c
xen/arch/x86/hvm/vmx/vmx.c
xen/include/public/hvm/save.h

index d3df4a5c3e4d6dc6b448c60e72511fcbcf7f69cd..740c2138a4ce58993fc96abd06a0c5fdcd675396 100644 (file)
@@ -362,7 +362,7 @@ static inline void __restore_debug_registers(struct vcpu *v)
 }
 
 
-int svm_vmcs_save(struct vcpu *v, struct hvm_hw_cpu *c)
+int svm_vmcb_save(struct vcpu *v, struct hvm_hw_cpu *c)
 {
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
 
@@ -571,17 +571,14 @@ void svm_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
 {
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
 
-    data->shadow_gs = vmcb->kerngsbase;
-    /* MSR_LSTAR, MSR_STAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_EFER */    
-    data->msr_items[0] = vmcb->lstar;
-    data->msr_items[1] = vmcb->star;
-    data->msr_items[2] = vmcb->cstar;
-    data->msr_items[3] = vmcb->sfmask;
-    data->msr_items[4] = vmcb->efer;
+    data->shadow_gs        = vmcb->kerngsbase;
+    data->msr_lstar        = vmcb->lstar;
+    data->msr_star         = vmcb->star;
+    data->msr_cstar        = vmcb->cstar;
+    data->msr_syscall_mask = vmcb->sfmask;
+    data->msr_efer         = vmcb->efer;
 
     data->tsc = hvm_get_guest_time(v);
-
-    // dump_msr_state(guest_state);
 }
 
 
@@ -590,22 +587,19 @@ void svm_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
     struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
 
     vmcb->kerngsbase = data->shadow_gs;
-    /* MSR_LSTAR, MSR_STAR, MSR_CSTAR, MSR_SYSCALL_MASK, MSR_EFER */
-    vmcb->lstar  = data->msr_items[0];
-    vmcb->star   = data->msr_items[1];
-    vmcb->cstar  = data->msr_items[2];
-    vmcb->sfmask = data->msr_items[3];
-    vmcb->efer   = data->msr_items[4];
+    vmcb->lstar      = data->msr_lstar;
+    vmcb->star       = data->msr_star;
+    vmcb->cstar      = data->msr_cstar;
+    vmcb->sfmask     = data->msr_syscall_mask;
+    vmcb->efer       = data->msr_efer;
 
     hvm_set_guest_time(v, data->tsc);
-
-    // dump_msr_state(guest_state);
 }
 
 void svm_save_vmcb_ctxt(struct vcpu *v, struct hvm_hw_cpu *ctxt)
 {
     svm_save_cpu_state(v, ctxt);
-    svm_vmcs_save(v, ctxt);
+    svm_vmcb_save(v, ctxt);
 }
 
 int svm_load_vmcb_ctxt(struct vcpu *v, struct hvm_hw_cpu *ctxt)
index d3ba86b7d03182fa5d6791e1034c3135d1715ed7..9db77e7d2a9fdd80e603e476cb7c677968b33652 100644 (file)
@@ -583,15 +583,17 @@ void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
 {
     struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
     unsigned long guest_flags = guest_state->flags;
-    int i = 0;
 
     data->shadow_gs = guest_state->shadow_gs;
 
     /* save msrs */
     data->flags = guest_flags;
-    for (i = 0; i < VMX_MSR_COUNT; i++)
-        data->msr_items[i] = guest_state->msrs[i];
-    
+    data->msr_lstar        = guest_state->msrs[VMX_INDEX_MSR_LSTAR];
+    data->msr_star         = guest_state->msrs[VMX_INDEX_MSR_STAR];
+    data->msr_cstar        = guest_state->msrs[VMX_INDEX_MSR_CSTAR];
+    data->msr_syscall_mask = guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK];
+    data->msr_efer         = guest_state->msrs[VMX_INDEX_MSR_EFER];
+
     data->tsc = hvm_get_guest_time(v);
     
     dump_msr_state(guest_state);
@@ -599,13 +601,15 @@ void vmx_save_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
 
 void vmx_load_cpu_state(struct vcpu *v, struct hvm_hw_cpu *data)
 {
-    int i = 0;
     struct vmx_msr_state *guest_state = &v->arch.hvm_vmx.msr_state;
 
     /* restore msrs */
     guest_state->flags = data->flags;
-    for (i = 0; i < VMX_MSR_COUNT; i++)
-        guest_state->msrs[i] = data->msr_items[i];
+    guest_state->msrs[VMX_INDEX_MSR_LSTAR]        = data->msr_lstar;
+    guest_state->msrs[VMX_INDEX_MSR_STAR]         = data->msr_star;
+    guest_state->msrs[VMX_INDEX_MSR_CSTAR]        = data->msr_cstar;
+    guest_state->msrs[VMX_INDEX_MSR_SYSCALL_MASK] = data->msr_syscall_mask;
+    guest_state->msrs[VMX_INDEX_MSR_EFER]         = data->msr_efer;
 
     guest_state->shadow_gs = data->shadow_gs;
 
index 9daabc432192b3508fe360e17c5d017ceb38d68f..9b1a7c24e98bef9d4653cde1df02fca2ee42163f 100644 (file)
@@ -140,10 +140,16 @@ struct hvm_hw_cpu {
     uint64_t sysenter_esp;
     uint64_t sysenter_eip;
 
-    /* MSRs */
+    /* msr for em64t */
     uint64_t shadow_gs;
     uint64_t flags;
-    uint64_t msr_items[6];
+
+    /* msr content saved/restored. */
+    uint64_t msr_lstar;
+    uint64_t msr_star;
+    uint64_t msr_cstar;
+    uint64_t msr_syscall_mask;
+    uint64_t msr_efer;
 
     /* guest's idea of what rdtsc() would return */
     uint64_t tsc;
@@ -311,7 +317,6 @@ struct hvm_hw_pci_link {
 
 DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link);
 
-
 /* 
  *  PIT
  */